#!/bin/bash

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_err()  { echo -e "${RED}[ERR ]${NC} $1"; }

# 获取配置文件的路径
# 逻辑：
# 1. 如果传入了参数且文件存在，使用参数指定的文件。
# 2. 否则，自动查找 ../configs/ 目录下唯一的 *.json 文件。
get_config_file() {
    local input=$1
    local config_dir="$SCRIPT_HOME/../configs"
    
    # 1. 优先使用传入参数
    if [ -n "$input" ] && [ -f "$input" ]; then
        echo "$input"
        return
    fi
    
    # 2. 自动查找 configs 目录下唯一的 json 文件
    # find 查找 maxdepth 1，即只在 configs 当前层级查找
    local auto_conf=$(find "$config_dir" -maxdepth 1 -name "*.json" | head -n 1)

    if [ -n "$auto_conf" ]; then
        echo "$auto_conf"
    else
        # 找不到时的兜底（虽然逻辑上应该存在）
        echo "$config_dir/ztzh_config_iso.json"
    fi
}

# 执行单个模块的特定脚本
# 参数: 1=ConfigFile 2=ModuleName 3=ScriptType(install/uninstall/run/check_vers)
exec_module_script() {
    local config_file=$1
    local module_name=$2
    local script_type=$3
    local script_name="${script_type}.sh"

    # 从JSON中提取该模块的配置
    local module_json=$(jq -c ".modules[] | select(.name == \"$module_name\")" "$config_file")
    
    if [ -z "$module_json" ]; then
        return 0 # 模块未找到，跳过
    fi

    # 提取激活的版本
    local active_ver=$(echo "$module_json" | jq -r '.active_version // empty')
    local active_sub=$(echo "$module_json" | jq -r '.active_sub_version // empty')

    # 如果没有激活版本，跳过
    if [ -z "$active_ver" ] || [ "$active_ver" == "null" ]; then
        log_info "模块 [$module_name] 未配置激活版本，跳过。"
        return 0
    fi

    # 构建脚本路径: iso_root/模块名/版本号/脚本.sh
    # 注意：脚本是相对于执行路径的，我们需要定位到绝对路径或相对正确的路径
    # 假设调用者都在 scripts 目录下运行
    local module_path="$SCRIPT_HOME/../$module_name/$active_ver"
    local target_script="$module_path/$script_name"

    log_info "正在处理模块: $module_name | 版本: $active_ver | 子版本: $active_sub | 动作: $script_type"

    if [ -f "$target_script" ]; then
        # 切换到脚本所在目录执行，确保脚本内部相对路径正确
        pushd "$module_path" > /dev/null
        
        # 执行脚本，并将当前模块的完整json配置作为参数传入
        ./$script_name "$module_json"
        local ret=$?
        
        popd > /dev/null
        
        if [ $ret -ne 0 ]; then
            log_err "模块 [$module_name] 执行 $script_name 失败 (Code: $ret)"
            return 1
        else
            log_info "模块 [$module_name] 执行 $script_name 成功"
            return 0
        fi
    else
        # 脚本不存在默认视为成功
        log_warn "脚本不存在: $target_script (默认跳过)"
        return 0
    fi
}
